//package org.example.encrypt.dataBase;
//
//import cn.hutool.core.collection.CollUtil;
//import com.baomidou.mybatisplus.extension.service.IService;
//import io.swagger.annotations.Api;
//import io.swagger.annotations.ApiOperation;
//import lombok.Data;
//import lombok.RequiredArgsConstructor;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.web.bind.annotation.*;
//
//import java.util.ArrayList;
//
///**
// * @Author WeiBing
// * @Create 2024/8/21 11:30
// */
//@RestController
//@RequestMapping(value = "/operateDataBase")
//@Api(value = "OperateDataBase", tags = {"加解密数据库"})
//@Slf4j
//@RequiredArgsConstructor
//public class OperateDataBase {
//
//    private final DataBaseService dataBaseService;
//    private final RedisService redisService;
//
//    /**
//     * 刷数据库的幂等key，加密和解密
//     */
//    private static final String ENCRYPT_KEY = "org:encrypt";
//    private static final String DECRYPT_KEY = "org:decrypt";
//
//    @Data
//    public static class Param {
//        /**
//         * 需要加解密的表名
//         */
//        ArrayList<String> tableNames;
//    }
//
//    @ApiOperation("加密")
//    @GetMapping(value = "/encrypt")
//    public OrgResponse<String> encrypt(Param param) throws IllegalAccessException {
//        log.info("对数据库表进行加密，tableNames:{}", param.getTableNames());
//
//        /*
//         * 幂等约束
//         */
//        Boolean aTrue = redisService.setnx(ENCRYPT_KEY, "true");
//        log.info("redis操作，key:{},result:{}", ENCRYPT_KEY, aTrue);
//        // 返回true说明当前没有在加密，可以正常进行加密，否则就是正在加密，直接return
//        if (!aTrue) {
//            return OrgResponse.createBySuccess("数据正在加密中，请勿重复操作！");
//        }
//
//        ArrayList<String> tableNames = param.getTableNames();
//        if (CollUtil.isEmpty(tableNames)) {
//            return OrgResponse.createByErrorMessage("数据库表不能为空");
//        }
//        // 检查输入的表名是否都是正确的
//        ArrayList<IService<?>> services = new ArrayList<>();
//        for (String tableName : tableNames) {
//            IService<?> tableServiceByTableName = dataBaseService.getTableServiceByTableName(tableName);
//            services.add(tableServiceByTableName);
//        }
//        if (services.contains(null)) {
//            return OrgResponse.createByErrorMessage("存在不能识别的数据库表");
//        }
//        // 挨个对每个表里的数据进行加密
//        for (IService<?> service : services) {
//            dataBaseService.realCryptHandle(service, true);
//        }
//
//        redisService.delete(ENCRYPT_KEY);
//        return OrgResponse.createBySuccess("加密成功");
//    }
//
//    @ApiOperation("解密")
//    @GetMapping(value = "/decrypt")
//    public OrgResponse<String> decrypt(Param param) throws IllegalAccessException {
//        log.info("对数据库表进行解密，tableNames:{}", param.getTableNames());
//
//        /*
//         * 幂等约束
//         */
//        Boolean aTrue = redisService.setnx(DECRYPT_KEY, "true");
//        log.info("redis操作，key:{},result:{}", DECRYPT_KEY, aTrue);
//        if (!aTrue) {
//            return OrgResponse.createBySuccess("数据正在解密中，请勿重复操作！");
//        }
//
//        ArrayList<String> tableNames = param.getTableNames();
//        if (CollUtil.isEmpty(tableNames)) {
//            return OrgResponse.createByErrorMessage("数据库表不能为空");
//        }
//        // 检查输入的表名是否都是正确的
//        ArrayList<IService<?>> services = new ArrayList<>();
//        for (String tableName : tableNames) {
//            IService<?> tableServiceByTableName = dataBaseService.getTableServiceByTableName(tableName);
//            services.add(tableServiceByTableName);
//        }
//        if (services.contains(null)) {
//            return OrgResponse.createByErrorMessage("存在不能识别的数据库表");
//        }
//        // 挨个对每个表里的数据进行解密
//        for (IService<?> service : services) {
//            dataBaseService.realCryptHandle(service, false);
//        }
//
//        redisService.delete(DECRYPT_KEY);
//        return OrgResponse.createBySuccess("解密成功");
//    }
//
//
//}
